#include "mqtt_handler.h"
#include "shmem.h"
#include "yyz_handler.h"
#include <errno.h>
#include <signal.h>

// 元宇宙平台 MQTT服务器的IP
#define MQTT_SERVER_IP  "mqtt.yyzlab.com.cn"
// 子线程数
#define SUB_THREAD_SUM  2       

// 存储需要上报的数据
static char old_data[1024];
static char new_data[1024];

// 存储接收到的指令
static char cmd_buf[1024];

// 共享内存信息结构体
struct shmem_param param;


void* data_report_thread(void *arg);
void* cmd_issue_thread(void *arg);

int main()
{
    printf("元宇宙上报进程启动:\n");

    // 线程数组， 保存线程号
    pthread_t tid[SUB_THREAD_SUM];


    // 1. 初始化共享内存
    if(-1 == shmem_init(&param, "shmem", SHMEM_SIZE))
    {
        return -1;
    }

    msg_queue_id = msg_queue_init(MSG_QUEUE_NAME);
    if(-1 == msg_queue_id)
    {
        printf("[Error] : msg_queue_init() get msg queue id error!\n");
    }
    else
    {
        printf("[Success] : msg_queue_init() success, msqid = [%d]\n", msg_queue_id);
    }

    // 2. 初始化 mqtt 连接
    if(-1 == mqtt_init(MQTT_SERVER_IP))
    {
        return -1;
    }

    


    // 3. 创建数据采集线程
    if(0 != pthread_create(&tid[0], NULL, data_report_thread, NULL))
    {
        ERROR("pthread_create");
        return -1;
    }


    // 4. 创建指令接收线程
    if(0 != pthread_create(&tid[1], NULL, cmd_issue_thread, NULL))
    {
        ERROR("pthread_create");
        return -1;
    }


    int kill_rc;
    while (1)
    {
        //维护子线程
        for (int i = 0; i < SUB_THREAD_SUM; i++)
        {
            kill_rc = pthread_kill(tid[i], 0);
            if (kill_rc == ESRCH || kill_rc == EINVAL)
            {
                printf("sub thread[%ld] is dead, process will quit and restart now", tid[i]);
                exit(-1);
            }
        }
        sleep(3);
    }
}


// 数据上报子线程
void* data_report_thread(void *arg)
{

    char buf[1024];
    while(1)
    {
        // 先把上一次的数据保存到 old_data 中
        strcpy(old_data, new_data);
        
        // 从共享内存中读取新的数据
        strcpy(new_data, param.addr);

        // 3. 解析数据
        if(strlen(new_data) != 0)
        {
            data_handle(new_data, buf);
        }
        else
        {
            printf("new_data is NULL \n");
        }
    

        // 4. mqtt 发送
        mqtt_publish(TOPIC_CTL_UP, buf);

        sleep(3);
    }
}   

// 命令下达子线程
void* cmd_issue_thread(void *arg)
{
    while(1)
    {

        sleep(100);
    }
}
